package io.github.wslxm.springbootplus2.manage.sys.service;


import com.baomidou.mybatisplus.extension.service.IService;
import io.github.wslxm.springbootplus2.core.base.model.BasePage;
import io.github.wslxm.springbootplus2.manage.sys.model.dto.SysRoleDTO;
import io.github.wslxm.springbootplus2.manage.sys.model.entity.SysRole;
import io.github.wslxm.springbootplus2.manage.sys.model.query.SysRoleQuery;
import io.github.wslxm.springbootplus2.manage.sys.model.vo.SysRoleVO;
import io.github.wslxm.springbootplus2.manage.sys.model.vo.next.SysUserRolesVO;
import io.github.wslxm.springbootplus2.manage.sys.model.vo.next.SysRoleAuthVo;
import io.github.wslxm.springbootplus2.manage.sys.model.vo.next.SysRoleMenuVo;

import java.util.List;
import java.util.Map;

/**
 * 角色
 *
 * @author 王松
 * @WX-QQ 1720696548
 * @date 2019/11/13 15:10
 */
public interface SysRoleService extends IService<SysRole> {

    /**
     * 列表查询
     *
     * @param query query
     * @return com.baomidou.mybatisplus.core.metadata.BasePage<io.github.wslxm.springbootplus2.manage.admin.model.vo.RoleVO>
     * @version 1.0.0
     */
    BasePage<SysRoleVO> findPage(SysRoleQuery query);


    /**
     * 添加角色-默认有所有URL 权限
     *
     * @param dto dto
     * @return java.lang.String
     * @version 1.0.0
     */
    String insert(SysRoleDTO dto);


    /**
     * 编辑角色信息
     *
     * @param id  id
     * @param dto dto
     * @return java.lang.Boolean
     * @version 1.0.0
     */
    Boolean upd(String id, SysRoleDTO dto);


    /**
     * 删除角色并删除角色关联的  (权限+菜单+用户) 的关系数据
     *
     * @param roleId roleId
     * @return boolean
     * @version 1.0.0
     */
    boolean del(String roleId);


    /**
     * 查询指定角色的选中的菜单Ids
     *
     * @param roleId 角色Id
     * @return 带选中状态的菜单数据
     */
    List<SysRoleMenuVo> findMenuIdsById(String roleId);

    /**
     * 查询指定角色的选中的权限Ids
     *
     * @param roleId 角色Id
     * @return 带选中状态的菜单数据
     */
    List<SysRoleAuthVo> findAuthIdsById(String roleId);

    /**
     * 获取超管角色数据
     *
     * @return io.github.wslxm.springbootplus2.manage.admin.model.entity.Role
     * @version 1.0.0
     */
    SysRole findSuperManage();

    /**
     * 查询指定用户的当前角色 codes 列表
     *
     * @param userId
     * @return Map<用户id, 用户角色列表>
     * @author wangsong
     * @date 2022/8/18 14:31
     */
    List<String> findRoleCodesByUserId(String userId);

    /**
     * 查询指定用户的当前角色列表
     *
     * @param userId
     * @return Map<用户id, 用户角色列表>
     * @author wangsong
     * @date 2022/8/18 14:31
     */
    List<SysUserRolesVO> findRolesByUserId(String userId);

    /**
     * 查询指定用户角色列表（多用户）
     *
     * @param userIds
     * @return Map<用户id, 用户角色列表>
     * @author wangsong
     * @date 2022/8/18 14:31
     */
    Map<String, List<SysUserRolesVO>> findRolesByUserIds(List<String> userIds);

    /**
     * 通过角色code获取角色id
     *
     * @param code
     * @return
     */
    String findRoleIdByCode(String code);

    /**
     * 通过角色codes获取角色ids
     *
     * @param codes
     * @return key=code value=id
     */
    Map<String, String> findRoleIdsByCodes(List<String> codes);


    /**
     * 判断角色 Ids 中是否存在超管角色
     *
     * @param roleIds
     * @return java.lang.Boolean
     * @version 1.0.0
     */
    boolean isSuperManageByRoleIds(List<String> roleIds);


    /**
     * 判断指定用户是否存在超管角色
     *
     * @param userId
     * @return java.lang.Boolean
     * @version 1.0.0
     */
    boolean isSuperManageByUserId(String userId);


    /**
     * 清除指定角色的权限缓存
     *
     * @param roleCode
     * @return
     */
    boolean delAuthCacheByRoleCode(String roleCode);
}